CognitoのカスタムEメール送信者のLambdaトリガーで、AWS Encryption SDK for Pythonを利用して復号してみた

CognitoのカスタムEメール送信者のLambdaトリガーで、AWS Encryption SDK for Pythonを利用して復号してみた

Clock Icon2022.08.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アノテーションの小川です。

Cognito のカスタムEメール送信者のLambdaトリガーのドキュメントには、 Node.js のサンプルが載っています。
Python のサンプルが載っていなかったので、Python を利用して暗号化された内容を復号してみました。
なお、このブログでは KMS でのキーの作成や Cognito の設定には触れていません。

Lambda

ランタイムは Python3.9 で作成しています。

ソースコード

import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
import base64

client = aws_encryption_sdk.EncryptionSDKClient(
    commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
    )

kms_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(key_ids=[
  'arn:aws:kms:ap-northeast-1:xxx:key/xxx'
])

def lambda_handler(event, context):

  code = event["request"]["code"]
  ciphertext = base64.b64decode(code)
  
  plaintext, header = client.decrypt(
                      source=ciphertext,
                      key_provider=kms_key_provider
                    )
  print(plaintext)

主に参考にしたドキュメントは以下です。

カスタム E メール送信者の Lambda トリガー

AWS Encryption SDK for Python のコードの例

レイヤー

上記のソースコードでインポートしている aws_encryption_sdk はデフォルトのLambdaには存在しないため、レイヤーで追加します。
以下の方法でレイヤーを追加しました。

Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。

実際には以下のコマンドを実行し、作成した layer.zip を使用してコンソールからレイヤーを作成しました。

mkdir layer
cd layer
echo aws_encryption_sdk > requirements.txt
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" \
/bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
zip -r layer.zip python > /dev/null 

IAM ロール

Lambda を作成する際にデフォルトで付与されるポリシー(CloudWatch Logs へログ出力する権限)に加え、kms:Decrypt も許可しています。

復号できるか試してみた

Cognito のホストされた UI から SignUp を行い、Lambda に渡される暗号化された検証コードを復号できるか試してみます。

Lambda のログを確認すると、b'187857'がログ出力されていました。
187857を入力してみます。

設定していたリダイレクトURLにリダイレクトされ、無事復号できたことがわかりました。

参考資料

カスタム E メール送信者の Lambda トリガー

AWS Encryption SDK とは

AWS Encryption SDK for Python のコードの例

GitHub - aws/aws-encryption-sdk-python

aws-encryption-sdk-python/examples/src

Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.